{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "| # | 用法/模式 | 解决的问题 | 核心要点 | 典型场景 | 参考代码 |\n",
    "|---|---|---|---|---|---|\n",
    "| 1 | Pimpl（Opaque Pointer） | 隐藏实现、减少编译依赖、稳定ABI | 前置声明`Impl`，在类中持有`std::unique_ptr<Impl>`；在源文件定义`Impl` | 库对外接口、降低重编译成本 | 见代码1 |\n",
    "| 2 | RAII | 资源泄漏与异常安全 | 构造获取资源，析构释放；用`unique_ptr`/`lock_guard`等 | 文件句柄、互斥量、内存 | 见代码2 |\n",
    "| 3 | Rule of Zero | 避免手写资源管理 | 只使用具备正确语义的成员（如`std::string`/`vector`），不自定义5大函数 | 业务类无需自管资源 | 见代码3 |\n",
    "| 4 | Rule of Five | 手管资源需自定义特殊成员 | 定义/禁用：析构、复制构造/赋值、移动构造/赋值；通常提供`noexcept`移动 | 裸资源（C句柄/内存） | 见代码4 |\n",
    "| 5 | Copy-and-Swap | 复制赋值的异常安全和自洽 | 以值传参获取副本，然后`swap(*this,tmp)` | 强异常安全的赋值运算 | 见代码5 |\n",
    "| 6 | Move Semantics | 高效转移资源 | 实现移动构造/赋值；转移指针所有权；标记`noexcept` | 大对象返回、容器扩容 | 见代码6 |\n",
    "| 7 | 不可拷贝/可移动 | 明确所有权语义 | `delete`拷贝，`default`移动；成员用`unique_ptr` | 独占资源对象 | 见代码7 |\n",
    "| 8 | CRTP | 编译期多态/零开销抽象 | `template<class D> struct Base{...static_cast<D*>(this)->impl();}` | 数学库、策略类、EBO | 见代码8 |\n",
    "| 9 | SFINAE/Concepts | 约束模板、优雅重载 | `std::enable_if`或`requires`限制参与重载的模板 | 泛型库、可定制算法 | 见代码9 |\n",
    "|10| Type Erasure | 以运行时多态隐藏模板实参 | 用`std::function`/自制vtable封装概念 | 回调、插件、容器异质对象 | 见代码10 |\n",
    "|11| NVI（Non-Virtual Interface） | 稳定对外接口并统一前后置逻辑 | 公有非虚函数中调用受保护的虚函数`do_()` | 模板方法、库接口 | 见代码11 |\n",
    "|12| Traits/Tag Dispatch | 基于类型特性选择实现 | 定义`traits`或用`std::true_type/false_type`做重载分发 | 迭代器/数值算法优化 | 见代码12 |"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 示例1：Pimpl"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "C++17",
   "language": "C++17",
   "name": "xcpp17"
  },
  "language_info": {
   "codemirror_mode": "text/x-c++src",
   "file_extension": ".cpp",
   "mimetype": "text/x-c++src",
   "name": "C++17",
   "version": "17"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
